﻿using System;
using NUnit.Framework;
using Smartkernel;
using Smartkernel.Extensions;

namespace Smartkernel.NUnitTest.Extensions
{
    [Category("Extensions")]
    [TestFixture]
    public class SmartStringExtensionTest
    {
        [Test]
        public void Test()
        {
            //【01】中文验证测试（涉及方法：IsChinese）
            Assert.AreEqual("中国你好".IsChinese(), true);
            Assert.AreEqual("中".IsChinese(), true);
            Assert.AreEqual("d中国你好".IsChinese(), false);
            Assert.AreEqual("中smartkernel国".IsChinese(), false);
            Assert.AreEqual("123".IsChinese(), false);
            Assert.AreEqual("abc".IsChinese(), false);

            //【02】浮点数验证测试（涉及方法：IsDouble）
            Assert.AreEqual("0.0.012".IsDouble(), false);
            Assert.AreEqual("10".IsDouble(), true);
            Assert.AreEqual("1.23".IsDouble(), true);
            Assert.AreEqual("-123".IsDouble(), true);
            Assert.AreEqual("-123.5".IsDouble(), true);
            Assert.AreEqual("+123.30".IsDouble(), true);
            Assert.AreEqual("0".IsDouble(), true);
            Assert.AreEqual("+0".IsDouble(), true);
            Assert.AreEqual(".12".IsDouble(), true);
            Assert.AreEqual("+".IsDouble(), false);

            //【03】邮箱验证测试（涉及方法：IsEmail）
            Assert.AreEqual("caoyanbai@gmail.com".IsEmail(), true);
            Assert.AreEqual("www.caoyanbai@gmail.com".IsEmail(), true);
            Assert.AreEqual("smartkernel@yahoo.com.cn".IsEmail(), true);
            Assert.AreEqual("smartkernel@www.yahoo.com.cn".IsEmail(), true);
            Assert.AreEqual("中国@126.com".IsEmail(), true);
            Assert.AreEqual("smartkernel@中国.com".IsEmail(), true);

            //【04】整数验证测试（涉及方法：IsInteger）
            Assert.AreEqual("123".IsInteger(), true);
            Assert.AreEqual("-123".IsInteger(), true);
            Assert.AreEqual("0".IsInteger(), true);
            Assert.AreEqual("123d".IsInteger(), false);
            Assert.AreEqual("0.0".IsInteger(), true);
            Assert.AreEqual("123.00".IsInteger(), true);
            Assert.AreEqual("0.12".IsInteger(), false);

            //【05】字母验证测试（涉及方法：IsLetter）
            Assert.AreEqual("AasdcD".IsLetter(), true);
            Assert.AreEqual("D2".IsLetter(), false);

            //【06】字母和数字验证测试（涉及方法：IsLetterNumber）
            Assert.AreEqual("Asa334324asdcD".IsLetterNumber(), true);
            Assert.AreEqual("Asa33432.4asdcD".IsLetterNumber(), false);

            //【07】正则表达式验证测试（涉及方法：IsMatch）
            Assert.AreEqual("21312".IsMatch("[0-9]"), true);

            //【08】正整数验证测试（涉及方法：IsPositive）
            Assert.AreEqual("123".IsPositive(), true);
            Assert.AreEqual("0".IsPositive(), true);
            Assert.AreEqual("-0".IsPositive(), true);
            Assert.AreEqual("+0".IsPositive(), true);
            Assert.AreEqual("123.00".IsPositive(), true);
            Assert.AreEqual("+123.00".IsPositive(), true);
            Assert.AreEqual("123.01".IsPositive(), false);
            Assert.AreEqual("-123".IsPositive(), false);

            //【09】纯数字验证测试（涉及方法：IsNumber）
            Assert.AreEqual("123".IsNumber(), true);
            Assert.AreEqual("123.0".IsNumber(), false);
            Assert.AreEqual("123.45".IsNumber(), false);
            Assert.AreEqual("123d".IsNumber(), false);

            //【10】手机号码验证测试（涉及方法：IsMobilePhone）
            Assert.AreEqual("13683289716".IsMobilePhone(), true);
            Assert.AreEqual("23683289716".IsMobilePhone(), false);
            Assert.AreEqual("136832897".IsMobilePhone(), false);

            //【11】长度在指定范围验证测试（涉及方法：IsLengthInScope）
            Assert.AreEqual("12345".IsLengthInScope(0, 10), true);
            Assert.AreEqual("12345".IsLengthInScope(0, 3), false);
            Assert.AreEqual("12345".IsLengthInScope(5, 5), true);
            Assert.AreEqual("123".IsLengthInScope(5, 5), false);

            //【12】长度验证测试（涉及方法：IsLength）
            Assert.AreEqual("12345".IsLength(5), true);
            Assert.AreEqual("12345".IsLength(3), false);

            //【13】小数位数是否在指定范围验证测试（涉及方法：IsDecimalDigitsInScope）
            Assert.AreEqual("12345.1".IsDecimalDigitsInScope(0, 4), true);
            Assert.AreEqual("12345.1234".IsDecimalDigitsInScope(0, 4), true);
            Assert.AreEqual("12345.12345".IsDecimalDigitsInScope(0, 4), false);

            //【14】小数位数长度验证测试（涉及方法：IsDecimalDigits）
            Assert.AreEqual("12345.1".IsDecimalDigits(1), true);
            Assert.AreEqual("12345.1234".IsDecimalDigits(2), false);

            //【15】数字、字母和下划线验证测试（涉及方法：IsLetterNumberUnderline）
            Assert.AreEqual("asd1231_asd2".IsLetterNumberUnderline(), true);
            Assert.AreEqual("123213".IsLetterNumberUnderline(), true);
            Assert.AreEqual("aaasdsadsa".IsLetterNumberUnderline(), true);
            Assert.AreEqual("______".IsLetterNumberUnderline(), true);
            Assert.AreEqual("&*833".IsLetterNumberUnderline(), false);
            Assert.AreEqual("123123.asda".IsLetterNumberUnderline(), false);
            Assert.AreEqual("阿斯等级".IsLetterNumberUnderline(), false);

            //【16】Url验证测试（涉及方法：IsUrl）
            Assert.AreEqual("http://www.caoyanbai.com".IsUrl(), true);
            Assert.AreEqual("https://www.caoyanbai.com".IsUrl(), true);
            Assert.AreEqual("ftp://www.caoyanbai.com".IsUrl(), true);
            Assert.AreEqual("abcde://www.caoyanbai.com".IsUrl(), true);
            Assert.AreEqual("http://www.caoyanbai.com/login.aspx?ID=123&City=BeiJing".IsUrl(), true);
            Assert.AreEqual("www.caoyanbai.com/login.aspx?ID=123&City=BeiJing".IsUrl(), false);
            Assert.AreEqual("asd".IsUrl(), false);
            Assert.AreEqual("http://caoyanbai.com/login.aspx?ID=123&City=BeiJing".IsUrl(), true);
            Assert.AreEqual("http://blog.caoyanbai.com/login.aspx?ID=123&City=BeiJing".IsUrl(), true);

            //【17】时间格式验证测试（涉及方法：IsDateTime）
            Assert.AreEqual("2008-01-23".IsDateTime(), true);
            Assert.AreEqual("2008-01-23 12:32".IsDateTime(), true);
            Assert.AreEqual("2008年01月23".IsDateTime(), true);
            Assert.AreEqual("20080123".IsDateTime(), false);
            Assert.AreEqual("2008#01#23".IsDateTime(), false);
            Assert.AreEqual("2008-66-23".IsDateTime(), false);

            //【18】时间在指定范围内验证测试（涉及方法：IsDateTimeInScope）
            DateTime start = DateTime.Now.AddYears(-100);
            DateTime end = DateTime.Now.AddYears(100);
            Assert.AreEqual("2008-12-3".IsDateTimeInScope(start, end), true);
            Assert.AreEqual("2908-12-3".IsDateTimeInScope(start, end), false);

            //【19】电话号码验证测试（涉及方法：IsPhone）
            Assert.AreEqual("3410110".IsPhone(), true);
            Assert.AreEqual("0316-3410110".IsPhone(), true);
            Assert.AreEqual("020-3410110".IsPhone(), true);
            Assert.AreEqual("3410110转137".IsPhone(), true);
            Assert.AreEqual("3410110-132".IsPhone(), true);
            Assert.AreEqual("0316-12345678#566".IsPhone(), true);
            Assert.AreEqual("0316-1234567890#566".IsPhone(), false);
            Assert.AreEqual("asd".IsPhone(), false);
            Assert.AreEqual("1234567890".IsPhone(), false);
            Assert.AreEqual("12345".IsPhone(), false);
            Assert.AreEqual("03163-33333333".IsPhone(), false);

            //【20】邮编验证测试（涉及方法：IsZipCode）
            Assert.AreEqual("065201".IsZipCode(), true);
            Assert.AreEqual("13800138000".IsZipCode(), false);

            //【21】IP地址验证测试（涉及方法：IsIPAddress）
            Assert.AreEqual("211.66.4.102".IsIPAddress(), true);
            Assert.AreEqual("299.66.4.102".IsIPAddress(), false);
            Assert.AreEqual("211.66.4".IsIPAddress(), false);

            //【22】截取左侧固定长度测试（涉及方法：Left）
            Assert.AreEqual("1234567890".Left(5), "12345");

            //【23】截取右侧固定长度测试（涉及方法：Right）
            Assert.AreEqual("1234567890".Right(5), "67890");

            //【24】翻转字符串测试（涉及方法：Reverse）
            Assert.AreEqual("1234567890".Reverse(), "0987654321");

            //【25】获得字节长度测试（涉及方法：GetTrueLength）
            Assert.AreEqual("123ABC中国人abc()（）".GetTrueLength(), 21);

            //【26】全角、半角测试（涉及方法：ToString）
            Assert.AreEqual("abc123１２３,.()（）".ToString(SmartStringCaseType.SBC), "ａｂｃ１２３１２３，。（）（）");
            Assert.AreEqual("ａｂｃ１２３１２３,.()（），。".ToString(SmartStringCaseType.DBC), "abc123123,.()(),.");

            //【28】清理HTML标记测试（涉及方法：CleanHtmlTag）
            string html = "<html><head><title>世界你好</title></head><body>邮箱：<a href='http://www.126.com'>126</a><br>呵呵，好邮箱</body></html>";
            Assert.AreEqual(html.CleanHtmlTag().Contains("<"), false);
        }
    }
}
